package utils;

import java.io.*;
import java.text.DecimalFormat;
import java.util.regex.Pattern;

/**
 * @author Zhang Guangyong
 * @desacription 统一文件操作类
 * @date 2019年01月01日 0:31
 */
public class FileUtils {

    /**
     * 判断文件类型 根据文件名(包括后缀)
     */
    public static String getFileTypeByFileName(String fileName) {
        String prefix = "";
        if (ToolUtil.isNotEmpty(fileName)) {
            if (fileName.lastIndexOf(".") > 0) {
                prefix = fileName.substring(fileName.lastIndexOf("."));
                return getFileTypeByPrefix(prefix);
            } else {
                return "其他";
            }
        } else {
            return "其他";
        }
    }


    /**
     * 判断文件类型 根据后缀名
     */
    public static String getFileTypeByPrefix(String prefix) {
        // 判空
        if (ToolUtil.isEmpty(prefix)) {
            return "其他";
        }
        String fileType;
        String picType = "^.*?\\.(jpg|jpeg|bmp|gif|png)$";
        String docType = "^.*?\\.(doc|docx|txt|pdf|xls|xlsx)$";
        String eBookType = "^.*?\\.(epub)$";
        String rarType = "^.*?\\.(zip|rar|7z|gz|tar)$";
        String exeType = "^.*?\\.(exe)$";
        // 匹配正则表达式
        if (Pattern.matches(picType, prefix)) {
            fileType = "图片";
        } else if (Pattern.matches(docType, prefix)) {
            fileType = "文档";
        } else if (Pattern.matches(eBookType, prefix)) {
            fileType = "电子书";
        } else if (Pattern.matches(rarType, prefix)) {
            fileType = "压缩包";
        } else if (Pattern.matches(exeType, prefix)) {
            fileType = "应用程序";
        } else {
            fileType = "其他";
        }
        return fileType;
    }

    /**
     * 根据路径删除指定的目录或文件，无论存在与否
     *
     * @param sPath 要删除的目录或文件
     * @return 删除成功返回 true，否则返回 false。
     */
    public static boolean deleteFolder(String sPath) {
        File file = new File(sPath);
        // 判断目录或文件是否存在
        if (!file.exists()) {  // 不存在返回 false
            return false;
        } else {
            // 判断是否为文件
            if (file.isFile()) {  // 为文件时调用删除文件方法
                return deleteFile(sPath);
            } else {  // 为目录时调用删除目录方法
                return deleteDirectory(sPath);
            }
        }
    }

    /**
     * 删除单个文件
     *
     * @param sPath 被删除文件的文件名
     * @return 单个文件删除成功返回true，否则返回false
     */
    public static boolean deleteFile(String sPath) {
        boolean flag = false;
        if (sPath != null && !"".equals(sPath)) {
            File file = new File(sPath);
            // 路径为文件且不为空则进行删除
            if (file.isFile() && file.exists()) {
                file.delete();
                flag = true;
            }
        }
        return flag;
    }

    /**
     * 删除目录（文件夹）以及目录下的文件
     *
     * @param sPath 被删除目录的文件路径
     * @return 目录删除成功返回true，否则返回false
     */
    public static boolean deleteDirectory(String sPath) {
        //如果sPath不以文件分隔符结尾，自动添加文件分隔符
        if (!sPath.endsWith(File.separator)) {
            sPath = sPath + File.separator;
        }
        File dirFile = new File(sPath);
        //如果dir对应的文件不存在，或者不是一个目录，则退出
        if (!dirFile.exists() || !dirFile.isDirectory()) {
            return false;
        }
        boolean flag = true;
        //删除文件夹下的所有文件(包括子目录)
        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            //删除子文件
            if (files[i].isFile()) {
                flag = deleteFile(files[i].getAbsolutePath());
                if (!flag) {
                    break;
                }
            } //删除子目录
            else {
                flag = deleteDirectory(files[i].getAbsolutePath());
                if (!flag) {
                    break;
                }
            }
        }
        if (!flag) {
            return false;
        }
        //删除当前目录
        if (dirFile.delete()) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 判断文件夹是否存在
     */
    public static Boolean isDirExists(File file) {
        if (file.exists()) {
            if (file.isDirectory()) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    /**
     * 复制文件
     *
     * @param sourceFile 源文件对象
     * @param targetFile 目标文件对象
     */
    public static void copyFile(File sourceFile, File targetFile) throws IOException {
        // 新建文件输入流并对它进行缓冲
        FileInputStream input = new FileInputStream(sourceFile);
        BufferedInputStream inBuff = new BufferedInputStream(input);

        // 新建文件输出流并对它进行缓冲
        FileOutputStream output = new FileOutputStream(targetFile);
        BufferedOutputStream outBuff = new BufferedOutputStream(output);

        // 缓冲数组
        byte[] b = new byte[1024 * 5];
        int len;
        while ((len = inBuff.read(b)) != -1) {
            outBuff.write(b, 0, len);
        }
        // 刷新此缓冲的输出流
        outBuff.flush();
        //关闭流
        inBuff.close();
        outBuff.close();
        output.close();
        input.close();
    }

    /**
     * 根据字节数获取文件大小
     */
    public static String getPrintSize(int size) {
        //获取到的size为：1705230
        int GB = 1024 * 1024 * 1024;//定义GB的计算常量
        int MB = 1024 * 1024;//定义MB的计算常量
        int KB = 1024;//定义KB的计算常量
        DecimalFormat df = new DecimalFormat("0.00");//格式化小数
        String resultSize;
        if (size / GB >= 1) {
            //如果当前Byte的值大于等于1GB
            resultSize = df.format(size / (float) GB) + "GB   ";
        } else if (size / MB >= 1) {
            //如果当前Byte的值大于等于1MB
            resultSize = df.format(size / (float) MB) + "MB   ";
        } else if (size / KB >= 1) {
            //如果当前Byte的值大于等于1KB
            resultSize = df.format(size / (float) KB) + "KB   ";
        } else {
            resultSize = size + "B   ";
        }
        return resultSize;
    }

    /**
     * 清空文件夹
     * @param path : 文件夹路径
     * @author 张广勇
     * @date 2019/5/13 15:24
     */
    public static boolean emptyDir(String path){
        File file = new File(path);
        if(!file.exists()){//判断是否待删除目录是否存在
            System.err.println("The dir are not exists!");
            return false;
        }
        String[] content = file.list();//取得当前目录下所有文件和文件夹
        assert content != null;
        for(String name : content){
            File temp = new File(path, name);
            if(temp.isDirectory()){//判断是否是目录
                emptyDir(temp.getAbsolutePath());//递归调用，删除目录里的内容
                boolean delete = temp.delete();//删除空目录
            }else{
                if(!temp.delete()){//直接删除文件
                    System.err.println("Failed to delete " + name);
                }
            }
        }
        return true;
    }

}
